/**
 * 文件附件信息接口
 * 根据前端使用场景区分必需字段和可选字段
 */
export interface AttachmentInfo {
	/** 附件ID - 数据标识，操作必需 */
	id: number

	/** 原始文件名 - 展示必需 */
	originalName: string

	/** 文件大小（字节） - 展示必需 */
	fileSize: number

	/** 文件类型 - 图标展示、预览判断必需 */
	fileType: string

	/** 文件访问路径 - 下载、预览必需 */
	filePath: string

	// ==================== 时间相关可选字段 ====================

	/** 创建时间 - 展示用 */
	createTime?: string

	/** 上传时间 - 具体上传时间 */
	uploadTime?: string

	/** 更新时间 - 版本管理用 */
	updateTime?: string

	// ==================== 业务相关可选字段 ====================

	/** 业务类型编码 - 业务分类和权限控制 */
	businessCode?: string

	/** 所属系统编码 - 多系统场景 */
	sysCode?: string

	/** MIME类型 - 预览场景使用 */
	contentType?: string

	// ==================== 管理相关可选字段 ====================

	/** 创建者 - 管理页面展示 */
	createBy?: string

	/** 更新者 - 审计日志 */
	updateBy?: string

	/** 备注信息 - 文件说明 */
	remark?: string

	/** 删除标识 - 软删除恢复 (0未删除，1删除) */
	isDeleted?: number

	/** 存储文件名 - 服务端内部使用 */
	fileName?: string
}

/**
 * 通用响应接口
 */
export interface CommonResponse {
	/** 响应状态码 */
	code: number

	/** 响应消息 */
	msg: string

	/** 响应数据 */
	data?: unknown
}

/**
 * 文件上传响应接口
 */
export interface FileUploadResponse {
	/** 响应状态码 */
	code: number

	/** 响应消息 */
	msg: string

	/** 文件ID - 上传成功后返回 */
	data: number
}

// 批量文件上传响应接口
export interface FileUploadBatchResponse {
	/** 响应状态码 */
	code: number

	/** 响应消息 */
	msg: string

	/** 文件ID - 上传成功后返回 */
	data: number[]
}

/**
 * 文件上传请求参数
 */
export interface FileUploadParams {
	/** 所属系统编码 */
	sysCode: string

	/** 业务类型编码 - 可选 */
	businessCode?: string
}

/**
 * 文件列表查询参数
 */
export interface FileListParams {
	/** 所属系统编码 */
	sysCode?: string

	/** 业务类型编码 */
	businessCode?: string

	/** 文件类型过滤 */
	fileType?: string

	/** 页码 */
	pageNum?: number

	/** 每页大小 */
	pageSize?: number
}

/**
 * 创建附件信息的最小必需字段
 * 用于前端创建临时文件对象
 */
export type AttachmentInfoRequired = Pick<AttachmentInfo, 'id' | 'originalName' | 'fileSize' | 'fileType' | 'filePath'>

/**
 * 文件展示信息 - 前端展示组件使用
 * 包含展示所需的核心字段
 */
export interface FileDisplayInfo {
	id: number
	originalName: string
	fileSize: number
	fileType: string
	filePath: string
	createTime?: string
	createBy?: string
}
